#define _CRT_SECURE_NO_WARNINGS 1
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
using namespace std;
double Pow(double x, long long n)
{
    if (n == 0) return 1;
    double tmp = Pow(x, n / 2);
    return n % 2 == 1 ? tmp * tmp * x : tmp * tmp;
}
int mi(int x, int m)
{
    int ret = 1;
    for (int i = 0;i < m;i++)
    {
        ret *= x;
    }
    return ret;
}
//int main()
//{
//    int N = 0;
//    clock_t start, end;
//    scanf("%d", &N);
//    int i, a;
//    start = clock();
//    for (i = pow(10, N - 1); i <= pow(10, N) - 1; i++)
//    {
//        int sum = 0;
//        if (i == 153)
//        {
//            int a = 0;
//        }
//        int tmp = i;
//        while (tmp > 0)
//        {
//            a = tmp % 10;
//            sum += pow(a, N);
//            tmp /= 10;
//        }
//        if (sum == i)
//        {
//            printf("%d\n", i);
//        }
//    }
//    end = clock();
//    printf("%f", (double)(end - start) / CLOCKS_PER_SEC*1000);
//    return 0;
//}
class Solution
{
public:
    vector<vector<int>> vv;
    vector<int> tmp;
    vector<bool> check = {false,false,false,false,false,false,false};
    vector<vector<int>> permute(vector<int>& nums)
    {
        dfs(0,nums);
        return vv;
    }
    void dfs(int n,vector<int>& nums)
    {
       for (int i = 0;i < nums.size();i++)
       {
           if (check[i]) continue;
           tmp.push_back(nums[i]);
           check[i] = true;
           n++;
           if (n == nums.size())
           {
                vv.push_back(tmp);
                tmp.pop_back();
                check[i] = false;
           }
           else
           {
                dfs(n,nums);
                tmp.pop_back();
                check[i] = false;
           }
       }
    }
};
int main()
{
    vector<int> nums = { 0,1 };
    Solution().dfs(0, nums);
    return 0;
}